

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class GamePanel extends JPanel implements ActionListener {
    private static final int TILE_SIZE = 25; // 每个方块的大小
    private static final int GRID_WIDTH = 20; // 网格宽度
    private static final int GRID_HEIGHT = 20; // 网格高度
    private static final int GAME_SPEED = 150; // 游戏速度

    private Snake snake; // 蛇对象
    private Food food; // 食物对象
    private Timer timer; // 定时器
    private boolean running = false; // 游戏是否在运行
    private int score; // 当前分数

    public GamePanel() {
        setPreferredSize(new Dimension(TILE_SIZE * GRID_WIDTH, TILE_SIZE * GRID_HEIGHT)); // 设置面板大小
        setBackground(Color.BLACK); // 设置背景颜色为黑色
        setFocusable(true); // 使面板可聚焦
        addKeyListener(new KeyAdapter() { // 添加键盘监听器
            @Override
            public void keyPressed(KeyEvent e) {
                snake.changeDirection(e.getKeyCode()); // 改变蛇的方向
            }
        });
        startGame(); // 开始游戏
    }

    private void startGame() {
        snake = new Snake(GRID_WIDTH, GRID_HEIGHT, TILE_SIZE); // 初始化蛇
        food = new Food(GRID_WIDTH, GRID_HEIGHT, TILE_SIZE); // 初始化食物
        running = true; // 设置游戏为运行状态
        timer = new Timer(GAME_SPEED, this); // 创建定时器
        timer.start(); // 启动定时器
        score = 0; // 初始化分数
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (running) {
            food.draw(g); // 绘制食物
            snake.draw(g); // 绘制蛇
            drawScore(g); // 绘制分数
        } else {
            gameOver(g); // 游戏结束时绘制
        }
    }

    private void drawScore(Graphics g) {
        String scoreText = "Score: " + score; // 分数文本
        g.setColor(Color.WHITE); // 设置颜色为白色
        g.setFont(new Font("Helvetica", Font.BOLD, 20)); // 设置字体
        g.drawString(scoreText, 10, 20); // 绘制分数
    }

    private void gameOver(Graphics g) {
        String message = "Game Over"; // 游戏结束消息
        g.setColor(Color.RED); // 设置颜色为红色
        g.setFont(new Font("Helvetica", Font.BOLD, 50)); // 设置字体
        FontMetrics metrics = getFontMetrics(g.getFont());
        g.drawString(message, (getWidth() - metrics.stringWidth(message)) / 2, getHeight() / 2); // 居中绘制游戏结束消息
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (running) {
            snake.move(); // 移动蛇
            if (snake.checkCollisionWithFood(food)) { // 检查是否吃到食物
                snake.grow(); // 蛇增长
                food.respawn(); // 重新生成食物
                score += 10; // 增加分数
            }
            if (snake.checkCollisionWithWall() || snake.checkCollisionWithSelf()) { // 检查碰撞
                running = false; // 设置游戏为结束状态
            }
        }
        repaint(); // 重绘面板
    }
}